package persistencia.xml.pruebas;

import static org.junit.Assert.*;

import java.beans.DefaultPersistenceDelegate;
import java.io.File;
import java.util.TreeSet;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import compartido.IEntidad;

import persistencia.IGondola;
import persistencia.carreras.ClaveValor;
import persistencia.compartido.Tipo;
import persistencia.excepciones.StringDeConexionIncompatible;
import persistencia.xml.AlmacenXML;

public class TestAlmacenXML {

	AlmacenXML almacen;
	String directorio;	
	protected TreeSet<ClaveValor> SetClaveValor;
	
	@Before
	public void setUp() throws Exception {
		almacen = new AlmacenXML();
		directorio = "src/persistencia/xml/pruebas";
		
		almacen.registrarDelegado(
				new Tipo<IEntidad>(ClaveValor.class),
				new DefaultPersistenceDelegate(new String[] {"identificador","valor"})
		);
		
		SetClaveValor = new TreeSet<ClaveValor>();
		SetClaveValor.add(new ClaveValor("cero", "0:0"));
		SetClaveValor.add(new ClaveValor("a", "1:0"));
		SetClaveValor.add(new ClaveValor("b", "0:1"));
		SetClaveValor.add(new ClaveValor("c", "1:1"));
	}

	@After
	public void tearDown() throws Exception {
		File archivo = new File(directorio+"/ClaveValor.xml");
		if (archivo.exists())
			archivo.delete();
	}

	@Test
	public void ComprobarLaCorrectaInterpretacionDeLosStringDeConexion() {
		
		assertTrue(almacen.esValido("NombreDeDirectorio"));
		assertFalse(almacen.esValido("Noxml:NombreDeDirectorio"));
		assertTrue(almacen.esValido("xml:NombreDeDirectorio"));
	}

	public boolean abrirAlmacen(String StringDeConexion) {
		boolean abierto = false;
		try {
			almacen.abrir(StringDeConexion);
			abierto = true;
		} catch (StringDeConexionIncompatible e) {
			abierto = false;
		}
		return abierto;
	}
	
	@Test
	public void AbrirYCerrarUnAlmacen_EjecucionCorrecta() {
		assertTrue(abrirAlmacen("xml:"+directorio));
		almacen.cerrar();
	}
	
	@Test
	public void AbrirUnAlmacenYAgregarUnaGondola_EjecucionCorrecta() {
		
		abrirAlmacen("xml:"+directorio);
		
		Tipo<IEntidad> tipo = new Tipo<IEntidad>(ClaveValor.class);
		IGondola gondola = almacen.crearGondola(tipo);
		
		gondola.agregar(new ClaveValor("1", "uno"));

		almacen.guardar();
		almacen.cerrar();
		
		File dir = new File(directorio);
		File archivo = new File(dir.getAbsolutePath()+"/"+tipo.getNombre()+".xml");
		assertTrue(archivo.exists());
		archivo.delete();
	}

	@Test
	public void CrearGondolaCerrarAlmacenYObtenerLaMismaGondola_EjecucionCorrecta() {
		abrirAlmacen("xml:"+directorio);
		
		Tipo<IEntidad> tipo = new Tipo<IEntidad>(ClaveValor.class);
		IGondola gondola = almacen.crearGondola(tipo);
		
		for (ClaveValor claveValor : SetClaveValor)
			gondola.agregar(claveValor);
		gondola.guardar();
		gondola = null;
		almacen.cerrar();

		//Abro el almacen con el StringDeConexion simplificado.
		abrirAlmacen(directorio);
		gondola = almacen.obtenerGondola(tipo);
		
		for (IEntidad entidad : gondola) {
			if (entidad instanceof ClaveValor)
				assertTrue(SetClaveValor.contains(entidad));
		}
		
	}
}
